/**
 *  通用正则
 *  https://juejin.cn/post/6844903908410654728?searchId=2025020817302233DA2FA01AE928925675#heading-18
 *  https://juejin.cn/post/7022137582322450446?searchId=20250208172402128670231D7BBC7BED46#heading-47
 */

import { HMessage, HMessageType } from "@/hel";

/**
 * 判断是不是数字
 * @param v
 * @returns {boolean}
 */
export const isNum = (v: any): boolean => /^-?\d+$/.test(v);
/**
 * 判断是不是中文
 * @param v
 * @returns {boolean}
 */
export const isHanZi = (v: any): boolean => new RegExp("[\u4E00-\u9FA5]").test(v);
/**
 * 判断是不是字母
 * @param v
 * @returns {boolean}
 */
export const isZiMu = (v: any): boolean => new RegExp("[A-Za-z]").test(v);

/**
 * 手机号校验
 * required: true 必填，不能为空
 * required: false 或 空 不是必填，如果有内容则校验，无内容则不校验
 * @param rule
 * @param value
 * @param callback
 */
export const validatePhone = (rule: any, value: any, callback: any) => {
  // callback(new Error("请输入手机号码"));
  /**
   * ^1：以 1 开头，这是中国大陆手机号码的统一前缀。
   * ([3][0-9])：匹配130-139之间的号段（常见于移动、联通）。
   * ([4][0,1,4-9])：匹配以 4 开头的合法号段（例如 145、147、149）。
   * ([5][0-3,5-9])：排除无效的 154，保留如 150-153、155-159。
   * ([6][2,5,6,7])：匹配合法的 6 开头号段，如 162、165、166、167。
   * ([7][0-8])：匹配 170-178 的常规虚拟和运营商号段。
   * ([8][0-9])：匹配 180-189。
   * ([9][0-3,5-9])：排除 94，保留 90-93 和 95-99。
   * [0-9]{8}：手机号的后8位
   * @type {RegExp}
   */
  const reg2 = new RegExp(/^(13[0-9]|14[014-9]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/);
  // const reg3 = new RegExp(/^[1](([3][0-9])|([4][0,1,4-9])|([5][0-3,5-9])|([6][2,5,6,7])|([7][0-8])|([8][0-9])|([9][0-3,5-9]))[0-9]{8}$/);

  if (value === 0 || value === undefined || value === null || value === "") {
    if (rule.required == false || rule.required === undefined) {
      callback();
    } else {
      callback("请输入手机号码");
    }
  } else if (isHanZi(value)) {
    callback("手机号码不能输入汉字！");
  } else if (isZiMu(value)) {
    callback("手机号码不能输入字母！");
  } else if (value.length != 11) {
    callback("手机号码位数不对！");
  } else if (!reg2.test(value)) {
    callback("手机号码不正确！");
  }
};


export const validatePhoneOne = (rule: any, value: any, callback: any) => {
  if (value === "") {
    callback(new Error("请输入手机号码"));
  } else {
    const reg = new RegExp("[\u4E00-\u9FA5]");
    const reg1 = new RegExp("[A-Za-z]");
    const reg2 = new RegExp(/^(13[0-9]|14[014-9]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/);
    console.log("reg2.test(value)", reg2.test(value));
    if (reg.test(value)) {
      callback("手机号码不能输入汉字！");
    } else if (reg1.test(value)) {
      callback("手机号码不能输入字母！");
    } else if (!reg2.test(value)) {
      callback("手机号码不正确！");
    } else {
      callback();
    }
  }
};
/**
 * 价格校验
 * @param rule
 * @param value
 * @param callback
 */
export const validatePrice = (rule: any, value: any, callback: any) => {
  const reg = new RegExp(/^(([1-9]{1}\d*)|(0{1}))(\.\d{2})$/);
  if (reg.test(value) || value === "" || value === null || value === undefined) {
    callback();
  } else {
    callback("需要保留两位小数");
  }
};


export const validatefance = (rule: any, value: any, callback: any) => {
  if(value.length === 0){
    callback("请添加电子围栏");
  }else {
    callback();

  }
};

// 邮箱校验 el 上自带校验
// export const validateEmail = (rule: any, value: any, callback: any) => {
//   if (value === "") {
//     callback(new Error("请输入邮箱"));
//   } else {
//     const reg = new RegExp("[\u4E00-\u9FA5]");
//     const reg1 = new RegExp("[A-Za-z]");
//     const reg2 = new RegExp(/^(13[0-9]|14[014-9]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/);
//     if (reg.test(value)) {
//       callback("手机号码不能输入汉字！");
//     } else if (reg1.test(value)) {
//       callback("手机号码不能输入字母！");
//     } else if (!reg2.test(value)) {
//       callback("手机号码不正确！");
//     } else {
//       callback();
//     }
//   }
// };

/**
 * 大于0的数值类型校验
 * @param rule
 * @param value
 * @param callback
 */
export const validateNumber = (rule: any, value: any, callback: any) => {
  if (value === "") {
    callback(new Error("请输入"));
  } else if (!isNum(value * 1)) {
    callback("这不是一个数值！");
  } else {
    const num = Number(value);
    if (isNaN(num) || num <= 0) {
      callback("必须是一个大于0的数字！");
    } else {
      callback();
    }
  }
};

/**
 * 文件体积大小校验
 * @param file
 * @returns {boolean}
 */
export function beforeUpload5M(file: any) {
  const isPng = file.type === "image/png" || file.type === "image/jpeg" || file.type === "image/jpg";
  const isLt10M = file.size / 1024 / 1024 < 5;
  if (!isPng) {
    HMessage(HMessageType.warning, "仅能上传图片格式.");
  } else if (!isLt10M) {
    HMessage(HMessageType.warning, "每个附件限制大小5MB");
  }
  return isPng && isLt10M;
}

/**
 * 检查值是否为字符串
 * @param value
 * @returns {boolean}
 */
export const isString = (value: any): boolean => typeof value === "string";

/**
 * 判断是不是空数组
 * @param v
 * @returns {boolean}
 */
export const isNullObject = (v: any): boolean => Object.keys(v).length === 0;

/**
 * 身份证号码正则匹配（正则表达式）
 * @param rule
 * @param value
 * @param callback
 */
export const validateIdCardNumber = (rule: any, value: any, callback: any) => {
  const _IDRe18 = /^([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
  const _IDre15 = /^([1-6][1-9]|50)\d{4}\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}$/;
  if (value === 0 || value === undefined || value === null || value === "") {
    if (rule.required == false || rule.required === undefined) {
      callback();
    } else {
      callback("身份证号不能为空");
    }
  }
  if (_IDRe18.test(value) || _IDre15.test(value)) {
    callback();
  } else {
    callback("身份证格式不正确");
  }
};
